package com.linkdood.app.security;

import com.linkdood.app.constants.MenuConstants;
import com.linkdood.app.domain.Account;
import com.linkdood.app.service.AccountService;
import com.linkdood.app.utils.StringUtils;
import com.linkdood.app.vm.AccountVM;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Set;

/**
 * 自定义权限实现，ss取自SpringSecurity首字母
 */
@Service("ss")
public class PermissionService {

    private static final String ROLE_DELIMETER = ",";

    private final AccountService accountService;

    public PermissionService(AccountService accountService) {
        this.accountService = accountService;
    }

    /**
     * 验证用户是否具备某权限
     *
     * @param permission 权限字符串
     * @return 用户是否具备某权限
     */
    public boolean hasPermi(String... permission) {
        if (StringUtils.isEmpty(permission)) {
            return false;
        }
        // FIXME: 5/8/21 (gaoliusheng) 手机端普通用户需要访问部分管理员接口，所以临时处理，所有用户开放权限，后期统计处理普通用户的接口进行取消接口权限
        AccountVM currentAccountInfo = accountService.getCurrentAccountInfo();
        if (Account.isAdmin(currentAccountInfo.getId()) || currentAccountInfo.getRole().equals("ROLE_USER")) {
            return true;
        }
        if (StringUtils.isNull(currentAccountInfo) || StringUtils.isNull(currentAccountInfo.getCustomRole().getPermissions())) {
            return false;
        }
        return hasPermissions(currentAccountInfo.getCustomRole().getPermissions(), permission);
    }

    /**
     * 验证用户是否不具备某权限，与 hasPermi逻辑相反
     *
     * @param permission 权限字符串
     * @return 用户是否不具备某权限
     */
    public boolean lacksPermi(String permission) {
        return hasPermi(permission) != true;
    }

    // FIXME(gaoliusheng) 确认无用代码需要删除而不是注释
//    /**
//     * 验证用户是否具有以下任意一个权限
//     *
//     * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表
//     * @return 用户是否具有以下任意一个权限
//     */
//    public boolean hasAnyPermi(String permissions) {
//        if (StringUtils.isEmpty(permissions)) {
//            return false;
//        }
//        AccountVM currentAccountInfo = accountService.getCurrentAccountInfo();
//        if (StringUtils.isNull(currentAccountInfo) || StringUtils.isEmpty(currentAccountInfo.getCustomRole().getMenus())) {
//            return false;
//        }
//        Set<String> authorities = loginUser.getPermissions();
//        for (String permission : permissions.split(PERMISSION_DELIMETER)) {
//            if (permission != null && hasPermissions(authorities, permission)) {
//                return true;
//            }
//        }
//        return false;
//    }

    /**
     * 判断用户是否拥有某个角色
     *
     * @param role 角色字符串
     * @return 用户是否具备某角色
     */
    public boolean hasRole(String role) {
        if (StringUtils.isEmpty(role)) {
            return false;
        }
        AccountVM currentAccountInfo = accountService.getCurrentAccountInfo();
        if (StringUtils.isNull(currentAccountInfo) || StringUtils.isNull(currentAccountInfo.getCustomRole().getPermissions())) {
            return false;
        }
//        for (SysRole sysRole : loginUser.getUser().getRoles()) {
        String roleKey = currentAccountInfo.getCustomRole().getRoleKey();
        if (MenuConstants.SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) {
            return true;
        }
//        }
        return false;
    }

    /**
     * 验证用户是否不具备某角色，与 isRole逻辑相反。
     *
     * @param role 角色名称
     * @return 用户是否不具备某角色
     */
    public boolean lacksRole(String role) {
        return hasRole(role) != true;
    }

    /**
     * 验证用户是否具有以下任意一个角色
     *
     * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表
     * @return 用户是否具有以下任意一个角色
     */
    public boolean hasAnyRoles(String roles) {
        if (StringUtils.isEmpty(roles)) {
            return false;
        }
        AccountVM currentAccountInfo = accountService.getCurrentAccountInfo();
        if (StringUtils.isNull(currentAccountInfo) || StringUtils.isNull(currentAccountInfo.getCustomRole().getPermissions())) {
            return false;
        }
        for (String role : roles.split(ROLE_DELIMETER)) {
            if (hasRole(role)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断是否包含权限
     *
     * @param permissions 权限列表
     * @param permission  权限字符串
     * @return 用户是否具备某权限
     */
    private boolean hasPermissions(Set<String> permissions, String... permission) {
        for (String pers : permission) {
            if (permissions.contains(MenuConstants.ALL_PERMISSION) || permissions.contains(StringUtils.trim(pers))) {
                return true;
            }
        }
        return false;
    }
}
